package Servicios;

/**
 * @file Conexion.java
 * @brief Implementa la clase Conexion
 * 
 * Implementa la clase Conexión encargada de realizar las operaciones sobre la
 * base de datos.
 * 
 * @author Víctor Martínez Gómez
 * @version 01.01
 * 
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;


/**
 * @class Conexion
 * 
 * @brief Se encarga de realizar las operaciones sobre la base de datos.
 * 
 *        Se encarga de realizar la conexión, consultas a la base de datos y la
 *        desconexión. Antes de realizar una consulta con el método consultar,
 *        se debe haber realizado la conexión con el método conectar. Por
 *        último, recordar siempre cerrar la conexión con el método desconectar.
 * 
 */

public class Conexion {
	private static String _host = "";
	private static String _puerto = "";
	private static String _nombre = "";
	private static String _usuario = "";
	private static String _password = "";

	private static Connection conexion;
	private static Statement instruccion;

	/**
	 * 
	 * @brief Establece la conexión con la base de datos
	 * @throws SQLException
	 *             , IOException, ClassNotFoundException
	 * 
	 *             Establece la conexión con la base de datos recogiendo los
	 *             parámetros de un fichero de configuración (el fichero solo lo
	 *             lee en la primera conexión).
	 * 
	 */

	public static void conectar() throws SQLException, IOException,
			ClassNotFoundException {

		// Abrir y leer archivo de configuracion
		if (_host.equals("")) { // El archivo de configuracion no fue leido
			// anteriormente
			File archivo = new File("config");
			FileReader fr = new FileReader(archivo);
			BufferedReader br = new BufferedReader(fr);
			_host = br.readLine();
			_puerto = br.readLine();
			_nombre = br.readLine();
			_usuario = br.readLine();
			_password = br.readLine();
		}
		// Cargar clase de controlador de base de datos
		Class.forName("com.mysql.jdbc.Driver");

		// Crear el objeto de conexion a la base de datos
		conexion = DriverManager.getConnection("jdbc:mysql://" + _host + ":"
				+ _puerto + "/" + _nombre, _usuario, _password);
		instruccion = conexion.createStatement();
	}

	/**
	 * @brief Realiza una consulta a la base de datos
	 * @throws SQLException
	 * @param consulta
	 *            Cadena que contiene la sentencia a realizar sobre la base de
	 *            datos. Debe ser una operación de selección.
	 * 
	 *            Realiza una consulta a la base de datos. Anteriormente debe
	 *            haberse realizado la conexión con esta correctamente.
	 * 
	 */

	public static ResultSet consultar(String consulta) throws SQLException {
		return instruccion.executeQuery(consulta);
	}

	/**
	 * @brief Realiza una operación sobre la base de datos
	 * @throws SQLException
	 * @param Query
	 *            Cadena que contiene la sentencia a realizar sobre la base de
	 *            datos. Debe ser una operación insert, update o delete.
	 * 
	 *            Realiza una operación sobre la base de datos. Anteriormente debe
	 *            haberse realizado la conexión con esta correctamente.
	 * 
	 */

	public static ResultSet actualizar(String operacion) throws SQLException {
		instruccion.executeUpdate(operacion,Statement.RETURN_GENERATED_KEYS);
                return instruccion.getGeneratedKeys();
	}
	
	/**
	 * @brief Realiza la desconexión con la base de datos
	 * @throws SQLException
	 *             Cierra la conexión con la base de datos.
	 * 
	 */

	public static void desconectar() throws SQLException {
		conexion.close();
	}

        /**
	 * @brief Realiza la subida de una imagen a la base de datos
	 * @throws SQLException
         * @param consulta Cadena que contiene la secuencia ha realizar sobre la base de datos
         * @param imagen ruta hacia la imagen
	 * 
	 */
        public static Integer subirImagen( String consulta, String imagen) throws SQLException, IOException,
			ClassNotFoundException {
            
            //Leemos la imagen y la añadimos a la consulta
            FileInputStream is = new FileInputStream(imagen);
            PreparedStatement st = conexion.prepareStatement(consulta,Statement.RETURN_GENERATED_KEYS);
            st.setBlob(1, is);



            //Hacemos la consulta
            st.execute();

            ResultSet res = st.getGeneratedKeys();

            res.next();

            Integer i= res.getInt(1);

            //Cerramos los recursos
            is.close();
            st.close();

            return i;
        }
}
